//package com.lingyuan.product.config;
//
//import cn.hutool.core.collection.ListUtil;
//import com.alibaba.excel.context.AnalysisContext;
//import com.alibaba.excel.read.listener.ReadListener;
//import com.alibaba.excel.util.ListUtils;
//import com.alibaba.nacos.common.utils.CollectionUtils;
//import com.lingyuan.common.core.utils.StringUtils;
//import com.lingyuan.product.domain.UserExcel;
//import com.lingyuan.product.mapper.UserMapper;
//import lombok.extern.log4j.Log4j2;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.List;
//import java.util.concurrent.CopyOnWriteArrayList;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.stream.Collectors;
//
///**
// * @ClassName EasyExcelImportHandler
// * @Description 描述 文件监听器
// * @Author guoxin
// * @Date 2024/9/24 12:06
// */
//@Log4j2
//@Service
//public class EasyExcelImportHandler implements ReadListener<UserExcel> {
//    //成功数据
//   private final CopyOnWriteArrayList<UserExcel> list = new CopyOnWriteArrayList<>();
//   //单次处理的条数
//    private final static int BATCH_COUNT= 20000;
//    @Autowired
//    private ThreadPoolExecutor excelThreadExecutor;
//    @Resource
//    private UserMapper userMapper;
//    @Override
//    public void invoke(UserExcel userExcel, AnalysisContext analysisContext) {
//        if (StringUtils.isNotBlank(userExcel.getName())){
//            list.add(userExcel);
//            return;
//        }
//        if (list.size()>=BATCH_COUNT){
//            log.info("读取数据:{}",list.size());
//            userMapper.insertSelective(list);
//            //采用多线程 读取数据
////            saveData();
//        }
//    }
//
//    /**
//     * 采用多线程读取数据
//     * @param
//     */
//    private void saveData(){
//        List<List<UserExcel>> lists = ListUtil.split(list, 20000);
//        CountDownLatch latch = new CountDownLatch(lists.size());
//        userMapper.insertSelective(list);
//         for (List<UserExcel> userExcels : lists) {
//            excelThreadExecutor.execute(()->{
//                try {
//                    userMapper.insertSelective(userExcels.stream().map(o->{
//                        UserExcel userExcel = new UserExcel();
//                        userExcel.setId(o.getId());
//                        userExcel.setName(o.getName());
//                        userExcel.setPhoneNum(o.getPhoneNum());
//                        userExcel.setAddress(o.getAddress());
//                        return userExcel;
//                    }).collect(Collectors.toList()));
//                }catch (Exception e){
//                    log.error("启动线程失败:{}",e.getMessage());
//                }finally {
//                    //执行完一个线程减一 直到执行完
//                    latch.countDown();
//                }
//            });
//        }
//        //等所有线程执行完
//        try {
//            latch.await();
//        } catch (InterruptedException e) {
//            log.info("等所有线程执行完异常:{}",e.getMessage());
//        }
////        //提前将不再使用的集合清空 释放资源
//        list.clear();
//        lists.clear();
//    }
//
//    /**
//     * 所有的线程读取完在调用
//     * @param analysisContext
//     */
//    @Override
//    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//        //读取剩余数据
//        if (CollectionUtils.isNotEmpty(list)){
//            log.info("读取数据:{}条",list.size());
//            userMapper.insertSelective(list);
////            saveData();
//        }
//    }
//}
